# 这里是模型的模板代码
# 一般模型比较复杂,而且和设计相关,模型一般没有什么通用的内容

# 这里主要放上几个 以供参考

# 一般一个模型会包含多个部分  我们会将各个部分拆解为单独的类
# 一个模型要用到的层一般都在 init 里面定义,在forward里面使用

# 这里默认已经了解卷积层 bn层 激活层 全连接层

import torch
import torch.nn as nn
import torch.nn.functional as F

# 全连接做分类


# 假设问题场景  对于固定长度序列数据做分类   长度为n,类别有c类
# 我们的模型一般为 一个特征提取模块 一个分类器模块
# 这里特征提取模块 我们使用全连接神经网络 (你也可以改成其他的) + bn + 激活函数
# 激活函数一般都会选择relu或者relu的变种
# 特征提取层需要把高维变为低维特征  或者类似 mlp 做成隐藏层
# 我们这里使用三层全连接去做
class FullConnectFeatureExtract(nn.Module):
    def __init__(self, input_dim, latent_dim):
        super().__init__()
        self.linear1 = nn.Linear(input_dim, latent_dim)
        self.bn1 = nn.BatchNorm1d(latent_dim)
        self.activatefn1 = nn.ReLU()
        self.linear2 = nn.Linear(latent_dim, latent_dim)
        self.bn2 = nn.BatchNorm1d(latent_dim)
        self.activatefn2 = nn.ReLU()

    def forward(self, x):
        x = self.linear1(x)
        x = self.bn1(x)
        x = self.activatefn1(x)
        x = self.linear2(x)
        x = self.bn2(x)
        x = self.activatefn2(x)
        return x


class FullConnectCls(nn.Module):

    pass


# 图像分类模型

# 几点注意: 1. pytorch是channel first  pytorch中的batch feature shape是 b,c,h,w
# 2. 图像上 我们一般常用convolution来提取特征  但是这里一般会和很多东西融合在一起 . 这里有通用的几种方案 :


class customModel(nn.Module):
    def __init__(self, ):
        pass

    def forward(self, x):
        pass
